package com.fxu.framework.core.sql;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * 搜索条件，更新条件项 类
 *
 * @author 方旭
 * @version 1.6.0
 */
@Getter
@Setter
@ToString
public class SApply<SE extends SEntity<?>, LE extends SEntity<?>> implements SCompare<SApply<SE, LE>, SE>, SOrder<SApply<SE, LE>, SE> {

    /**
     * 实体类的类
     */
    protected Class<SE> clazz;

    /**
     * join 类型
     */
    private JoinType joinType;

    /**
     * 本实体关联字段
     */
    private SField<SE> thisField;

    /**
     * 其他实体关联字段
     */
    private SField<LE> otherField;

    /**
     * 查询条件(会判断是否存在)
     */
    private final List<SValue> queryList = new ArrayList<>();

    /**
     * OR 查询条件(相同Key下的List必须至少两个)
     */
    private final List<SChild<SE>> andOrList = new ArrayList<>();

    /**
     * 排序字段 order by XXX asc/desc 集合
     */
    protected final List<SValue> orderByFields = new ArrayList<>();

    /**
     * 创建SChild对象
     * @param <SE> SEntity对象类型
     * @param <LE> 其他对象类型
     * @param clazz SEntity类型对象
     * @return SChild 对象
     */
    public static <SE extends SEntity<?>, LE extends SEntity<?>> SApply<SE, LE> build(Class<SE> clazz) {
        return new SApply<>(clazz);
    }

    /**
     * 构造方法,设置实体类
     * @param clazz 实体类
     */
    public SApply(Class<SE> clazz) {
        this.clazz = clazz;
    }

    /**
     * 或者 OR
     * select * from test 1=1 and (name = 'A' OR id = 1)
     * @param consumer 执行方法
     * @return 返回本对象
     */
    public SApply<SE, LE> andOr(Consumer<SChild<SE>> consumer) {
        SChild<SE> sChild = new SChild<>(this.clazz);
        consumer.accept(sChild);
        andOrList.add(sChild);
        return this;
    }
}